package lx.do7;

import lx.do6.Student;

import java.util.Arrays;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author ZJL
 * @date 2025-04-02
 */
public class MainTest {

    /**
     * 判断一个分数是否合格
     * @param score
     * @param consumer
     */
    public static void checkScorePass(double score,Consumer<Double> consumer) {
        consumer.accept(score);
    }

    /**
     * 将字符串类转换为整数类型
     * @param input
     * @param function
     * @return
     */
    public static Integer toInter(String input, Function<String,Integer> function) {
        return function.apply(input);
    }

    public static void main(String[] args) {
//        五、JDK函数式接口的使用
//        1.定义一个学生类（姓名、年龄）,使用Supplier接口，
//        打印输出年龄最小的学生，格式为：姓名-年龄

        Student[] arr = {
                new Student("李四新", 21), new Student("张三李", 17),
                new Student("王李", 19), new Student("李六", 32)
        };

        Arrays.sort(arr,((o1, o2) -> o1.getAge() - o2.getAge()));
        Supplier<Student> supplier = () -> {
            return arr[0];
        };

        System.out.println(supplier.get());

//        2.定义一个方法：实现判断一个分数是否合格，并打印输出结果。

        checkScorePass(60, score -> {
            if (score < 60) {
                System.out.println("分数不及格！分数为："+score);
            }else{
                System.out.println("分数及格！分数为："+score);
            }
        });

//        3.定义一个学生类（姓名、年龄）；定义一个数组，存储若干学生；
//        定义三个Consumer，分别用于打印输出姓李的学生信息、
//        名字有三个字的学生信息、年龄大于18岁的学生。

        // 打印输出姓李的学生信息
        Consumer<String> consumer1 = str -> {
                for (Student student : arr) {
                    String name =  student.getName().charAt(0)+"";
                    if (name.equals(str)) {
                        System.out.println(student);
                    }
                }
        };
        consumer1.accept("李");

        // 打印名字有三个字的学生信息
        Consumer<Integer> consumer2 = len -> {
            for (Student student : arr) {
                if (student.getName().length()==len){
                    System.out.println(student);
                }
            }
        };
        consumer2.accept(3);

        // 打印年龄大于18岁的学生
        Consumer<Integer> consumer3 = age -> {
            for (Student student : arr) {
                if (student.getAge()>age){
                    System.out.println(student);
                }
            }
        };
        consumer3.accept(18);

//        4.判断邮箱地址是否合法，帐号必须至少由5个字符组成，而且有且只有一个@字符

        Predicate<String> predicate = email -> {
            String emailRegex = "^[a-zA-Z0-9._%+-]{5,}+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
            Pattern pattern = Pattern.compile(emailRegex);
            Matcher matcher = pattern.matcher(email);
            return matcher.matches();
        };
        String email = "zing173@qq.com";
        if (predicate.test(email)){
            System.out.println("邮箱地址合法！");
        }else{
            System.out.println("邮箱地址不合法");
        }

//        5.把字符串"张三,18"转换为学生对象（学生类同上）
        String s1 = "张三,18";
        String[] split = s1.split(",");
        Integer inter = toInter(split[1], string -> Integer.valueOf(split[1]));
        Student stu =new Student(split[0],inter);
        System.out.println(stu);



//        6.把字符串"张三,18"转换为学生对象，获取学生对象的年龄，
//        加1岁后转换为整数。

        Integer age = toInter(split[1], string -> Integer.parseInt(split[1])+1);
        Student s2 =new Student(split[0],age);
        System.out.println(s2);

    }


}
